
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>观察者设计模式 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>观察者设计模式 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">观察者设计模式的核心定义是什么？它定义了怎样一种对象间的关系？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">观察者设计模式是一种行为型设计模式，它定义了一种对象间的一对多依赖关系。当一个对象（主题）的状态发生变化时，所有依赖于它的对象（观察者）都会得到通知并自动更新。</div>
          </div>
          <div class="card-source">来源: 文档「观察者设计模式：松耦合的事件通知机制」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">观察者模式为什么能够实现主题（Subject）和观察者（Observer）之间的“松耦合”？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">因为它将主题和观察者解耦，使它们可以独立地变化，互不影响。主题对象只维护其依赖者列表，并通过一个统一的通知机制与观察者通信，而不需要知道观察者的具体实现细节。</div>
          </div>
          <div class="card-source">来源: 文档中「特点」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">请列举观察者模式在软件开发中的三个典型使用场景。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">1. 事件驱动系统：当一个对象的状态变化需要通知其他对象时。<br>2. UI界面更新：用于实现模型与界面的分离，使界面能及时反映模型变化。<br>3. 分布式系统：用于实现消息通知和事件传递。</div>
          </div>
          <div class="card-source">来源: 文档中「使用场景」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">Spring框架是如何应用观察者模式来实现其事件驱动机制的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Spring框架中的事件驱动机制是观察者模式的应用，它通过`ApplicationEvent`（事件，相当于主题状态）和`ApplicationListener`（监听器，相当于观察者）来实现事件的发布和订阅。</div>
          </div>
          <div class="card-source">来源: 文档中「框架中的应用」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">在观察者模式的实现中，主题（Subject）接口通常需要定义哪三个核心方法？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">根据文档中的示例，主题接口通常需要定义三个核心方法：1. `registerObserver(Observer observer)` 用于注册观察者；2. `removeObserver(Observer observer)` 用于移除观察者；3. `notifyObservers()` 用于在状态变化时通知所有观察者。</div>
          </div>
          <div class="card-source">来源: 文档中「实现示例」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">当主题对象的状态发生变化时，通知所有观察者的完整流程是怎样的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">当主题对象的状态发生变化后（例如调用了 `setWeather` 方法），它会调用自身的 `notifyObservers()` 方法。该方法会遍历内部维护的观察者列表，并依次调用每个观察者对象的 `update()` 方法，从而将更新通知到所有订阅者。</div>
          </div>
          <div class="card-source">来源: 文档中「实现示例」部分</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
